<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        //js基本数据类型
        //如何判断
        //ES6

        //基本数据类型  Number  String  Boolean  Null  undefined  Syboml
        //引用数据类型  Array   Object

        //深拷贝浅拷贝区别  
            //简单来说，假设B复制A，当修改A时，看B是否发生改变，如果B发生改变说明是浅拷贝S
            //如果B不发生改变，那么就是深拷贝
            //官方解释
            //在拷贝原始数据类型的时候其实是不区分深拷贝与浅拷贝的，因为都是拷贝原始数据类型的值。
            //当拷贝的是引用数据类型的时候，则区分浅拷贝、深拷贝，因为浅拷贝只复制引用数据类型的第一层属性、深拷贝可以对引用数据类型的属性进行递归复制。
        //浅拷贝
            // 1. 直接赋值
            // 2. Object.assign() 拷贝属性值 假如说属性值是一个对象的引用，那么也会指向那个引用
            // 3. concat()
            // 4. slice
            // 5. 扩展运算符  [...] {...}
            // 6. lodash.clone()
            //一个新的对象对原始对象进行精确地拷贝如果拷贝的是原始数据类型，
            //拷贝的就是原始数据类型的值，如果是引用数据类型，拷贝的就是内存地址。
            //如果其中一个对象的引用内存地址发生改变，另一个对象也会发生变化。

        //深拷贝方法 
        //1、 JSON.parse(JSON.stringify(obj))
        //缺点拷贝的对象中如果有函数，undefined，symbol，当使用过JSON.stringify()进行处理之后，都会消失。
        //2、loadsh.deepCopy

        //typeof 基础数据类型
        //注意返回值是字符串类型
        //instanceof运算符用于用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
        console.log([] instanceof Array)  //true
        console.log({} instanceof Object)  //true
        console.log(1 instanceof Number)   //false
        function fun() {

        }
        const fn = new fun()
        console.log(fn instanceof Object)  //true
        console.log(fun instanceof Object) //true

        //隐式转换
        //隐式转换Object.prototype.toString
        const obj = {}
        console.log(obj.toString())  //[object Object]

        const arr = []
        console.log(Object.prototype.toString.call(arr))  //[object Array]

        const a = 1
        console.log(Object.prototype.toString.call(a))    //[object Number]


        //ES6

        let arr1 = [1, 2]
        let arr2 = arr1
        arr2[0] = 33
        console.log(arr1, arr2)

        // let arr1=[1,2]
        // let arr2=arr1.concat()
        // arr2[0]=33
        // console.log(arr1,arr2)

        //Map
        let data = new Map()
        data.set("a", 11)
        data.set("b", 22)
        data.delete("b")
        console.log(data)
        console.log(data.has("c"))  //false
        console.log(data.has("a"))  //true

    </script>


</body>

</html>